
#ifndef _CDS_ZLES_H_
#define _CDS_ZLES_H_

#include "Equations/Momentum_ZCoDi.hpp"

namespace Tuna {
  
  template <typename T, int Dim> class CDS_ZLES;
  
  template <typename T>
  struct Typeinfo <CDS_ZLES<T, 1> > {
    typedef T prec_t;
    enum { Dim = 1 };
  };
  
  template <typename T>
  struct Typeinfo <CDS_ZLES<T, 2> > {
    typedef T prec_t;
    enum { Dim = 2 };
  };
  
  template <typename T>
  struct Typeinfo <CDS_ZLES<T, 3> > {
    typedef T prec_t;
    enum { Dim = 3 };
  };

template<class Tprec, int Dim>
class CDS_ZLES : public Momentum_ZCoDi<CDS_ZLES<Tprec, Dim> >
{
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aE;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aW;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aN;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aS;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aF;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aB;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::aP;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::sp;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::dx;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::dy;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::dz;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::bi;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::ei;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::bj;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::ej;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::bk;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::ek;
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::dt;    
  using GeneralEquation<Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > > >::applyBoundaryConditions3D;
  
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::Gamma;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::Rayleigh;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::phi_0;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::T;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::u;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::v;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::w;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::p;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::dw;
  using Momentum_ZCoDi<CDS_ZLES<Tprec, Dim > >::calc_dw_3D;

public:

  typedef Tprec prec_t;
  typedef typename TunaArray<prec_t, Dim >::huge ScalarField;
  
  CDS_ZLES() : Momentum_ZCoDi<CDS_ZLES<prec_t, Dim> >() { }
  ~CDS_ZLES() { }; 

  /*!
   * FVM coefficients calculations for the case of turbulent flow
   * Here the turbulent viscosity is required as a parameter for
   * the adaptors.
   */
  inline bool calcCoefficients(const ScalarField &nut);

  inline void printInfo() { std::cout << " CDS_ZLES "; }
};

} // Tuna namespace

#include "../../../src/LES/Schemes/CDS_ZLES.cpp"

#endif //_CDS_ZLES_H_

















